#pragma once
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
//#include <pcl_ros/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/common/common.h>
#include <pcl/common/transforms.h>
#include <pcl/registration/icp.h>
//#include <pcl/common/transforms.h>
// 定义一个结构体来存储光线信息
struct Ray {
    Eigen::Vector3f origin;  // 光线起点
    Eigen::Vector3f direction;  // 光线方向
};
void cut_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud,pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud);
void rayBasedDenoising(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
void computeTransform(pcl::PointCloud<pcl::PointXYZ>::Ptr source,pcl::PointCloud<pcl::PointXYZ>::Ptr target );
void filter_point(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
void comput3Dcenter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,float &x,float &y);
void shift_point(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,float x,float y);
void gicp_compare(pcl::PointCloud<pcl::PointXYZ>::Ptr source,pcl::PointCloud<pcl::PointXYZ>::Ptr target );
void pipei_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_src,pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_tgt);
void ggicp(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source,pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target);
void ndt_test(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source,pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target);
bool isPointOnRay(const pcl::PointXYZ& point, const Ray& ray, float tolerance);